﻿#ifndef CAMERADATAREADTHREAD_H
#define CAMERADATAREADTHREAD_H

#include "Buffer.h"
#include <windows.h>
#include "CyAPI.h"

enum ParameterKind
{
    Set,                // 设置（修改）当前数值
    Get                 // 仅获取当前数值
};

/*
 *  直接与cyusb3014驱动进行数据交互的代码。
 */

class CameraDataReadThread : public QThread
{

public:
    /**
     @interpret   构造函数
     @param       Pbuffer: 缓冲区的句柄
     @return      无
     */
    CameraDataReadThread(Buffer* Pbuffer);

    /**
     @interpret   将数据保存至缓冲区m_Buffer中
     @param       PData: 需要保存至缓冲区的句柄; len: 需要缓存数据的长度
     @return      无
     */
    bool DataSave(uint8_t* PData, size_t len);
    /**
     @interpret   一直从下位机摄像头读取数据，并将数据上传至缓冲区m_Buffer中，
     @param       无
     @return      无
     */
    void run() override;

    /**
     @interpret   用于获取/修改当前类中m_ReadInAddress输入端点的地址
     @param       Kind: 当前操作类型(修改或者查看)data: 将要修改或者返回的数值
     @return      true-成功;false-失败;
     */
    bool InAddress(ParameterKind Kind, uint8_t* data);

    /**
     @interpret   获取当前打开设备的索引
     @param       Kind: 当前操作类型(修改或者查看)i: 当前打开设备索引;inAddress: 表示当前输入端点地址
     @return      true-成功;false-失败;
     */
    bool CurrentOpen(ParameterKind Kind, int* i, uint8_t* inAddress);

    /**
     @interpret   关闭当前打开设备
     @param       无
     @return      true-成功;false-失败;
     */
    bool CloseCurrentDevice();
public slots:
    /**
     @interpret   从对应输入端点读取数据
     @param       无
     @return      无
     */
    Q_INVOKABLE void Read();
public:
    static bool isRun;                  // 表示当前线程是否继续运行(从下位机读取数据)
private:
    Buffer*			m_Buffer;			// 表示当前线程需要写入缓冲区类型
    CCyUSBDevice*	m_UsbDevice;		// 用于连接外部设备
    CCyUSBDevice* m_CurrentDevice;      // 当前连接设备(用于读取设备信息的CCyUSBDevice对象必须与之前声明以及注册在同一线程不然OPen会失败)
    CCyUSBEndPoint* m_Recvice;			// 用于接收数据的对象
    uint8_t* m_PBufferData;				// 当前暂时使用的缓冲区指针对象
    uint8_t* m_PDataHead;				// 循环队列头指针
    uint8_t* m_PDataTail;				// 循环队列尾指针
    size_t   m_DataSize;				// 有效数据长度
    size_t m_Cols = ImageDefaultWidth * ImageDefaultPixel;	// 一行数据所占字节数
    int num = 1;                        // 表示当前行数

    uint8_t  m_ReadInAddress;           // 表示当前设备的IN端点地址
    int      m_CurrentOpen;             // 当前打开设备的索引

    QWaitCondition m_Wait;              // 用于阻塞run方法
    QMutex m_Mutex;                     // 用于给wait阻塞用的锁
};

#endif // CAMERADATAREADTHREAD_H
